#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>

void pr_exit(int status) {
	if (WIFEXITED(status)) {
		printf("normal termination, exit status = %d\n", WEXITSTATUS(status));
	} 
	else if (WIFSIGNALED(status)) {
		printf("abnormal termination, signal number = %d\n", WTERMSIG(status));
	}
	else if (WIFSTOPPED(status)) {
		printf("child stopped, signal number = %d\n", WSTOPSIG(status));
	}
}

int main() {
	pid_t pid;
	int status;

	if ((pid=fork()) < 0) {
		printf("fork error: %s\n", strerror(errno));
		return -1;
	} 
	else if (pid == 0) {
		exit(7);
	}

	if (wait(&status) != pid) {
		printf("wait error: %s\n", strerror(errno));
		return -1;
	}
	pr_exit(status);

	if ((pid=fork()) < 0) {
		printf("fork error: %s\n", strerror(errno));
		return -1;
	} 
	else if (pid == 0) {
		abort();
	}

	if (wait(&status) != pid) {
		printf("wait error: %s\n", strerror(errno));
		return -1;
	}
	pr_exit(status);

	if ((pid=fork()) < 0) {
		printf("fork error: %s\n", strerror(errno));
		return -1;
	} 
	else if (pid == 0) {
		status /= 0;
	}

	if (wait(&status) != pid) {
		printf("wait error: %s\n", strerror(errno));
		return -1;
	}
	pr_exit(status);
	return 0;
}